package ramosmanuales.util;

import java.util.Calendar;
import java.util.Date;

public class Quincena {

    private Integer anio;
    private Integer quincena;

    public int getAnio() {
        return anio;
    }

    public void setAnio(Integer anio) {
        this.anio = anio;
    }

    public int getQuincena() {
        return quincena;
    }

    public void setQuincena(Integer quincena) {
        this.quincena = quincena;
    }

    public Quincena() {
        anio = 0;
        quincena = 0;
    }

    public Quincena(int anio, int quincena) {
        this.anio = anio;
        this.quincena = quincena;
    }

    public static int getQuincena(Date fecha) {
        Calendar c = Calendar.getInstance();
        c.setTime(fecha);
        int dia = c.get(Calendar.DATE);
        int mes = c.get(Calendar.MONTH);
        mes = (mes + 1) * 2;
        return (dia < 16) ? mes - 1 : mes;
    }

    public static int getQuincenaVencida(Date fecha) {
        Calendar c = Calendar.getInstance();
        c.setTime(fecha);
        int dia = c.get(Calendar.DATE);
        int mes = c.get(Calendar.MONTH);
        mes = (mes + 1) * 2;
        mes = (dia < 16) ? mes - 1 : mes;
        return mes == 1 ? 24 : mes-1;
    }

    public boolean isInRange(Quincena qnaIni, Quincena qnaFin){
        int res = compareQuincenas(qnaIni, qnaFin);

        if(res > 0){
            Quincena aux = qnaIni;
            qnaIni = qnaFin;
            qnaFin = aux;
        }

        if(compareQuincenas(this, qnaIni)>-1){
            if(compareQuincenas(this, qnaFin)<1){
                return true;
            }
        }
        
        return false;
    }

    public static int compareQuincenas(Quincena quincena1, Quincena quincena2) {
        int res = 0;
        int anio1 = quincena1.getAnio(), anio2 = quincena2.getAnio(),
                qna1 = quincena1.getQuincena(), qna2 = quincena2.getQuincena();
        if (anio1 < anio2) {
            res = -1;
        } else {
            if (anio1 > anio2) {
                res = 1;
            } else {
                if (qna1 < qna2) {
                    res = -1;
                } else {
                    if (qna1 > qna2) {
                        res = 1;
                    } else {
                        res = 0;
                    }
                }
            }
        }
        return res;
    }

    public static int quincenasEntre(Quincena inicio, Quincena fin, boolean pensionado) {
        int quincenas = pensionado ? 12 : 24;
        if (fin.anio > inicio.anio) {
            int difanios = fin.anio - inicio.anio;
            if (inicio.quincena > fin.quincena) {
                return ((difanios - 1) * quincenas)
                        + quincenas - inicio.quincena
                        + fin.quincena;
            } else {
                return (difanios * quincenas)
                        + (fin.quincena - inicio.quincena);
            }
        } else {
            return fin.quincena - inicio.quincena;
        }
    }

    public static Quincena toQuincena(String qna){
        int anioQna = 0, quincenaQna = 0;
        anioQna = Integer.parseInt(qna.substring(0, 4));
        quincenaQna = Integer.parseInt(qna.substring(4, 5));
        return new Quincena(anioQna, quincenaQna);
    }

    @Override
    public String toString() {
        if(quincena < 10){
            return anio.toString()+"0"+quincena.toString();
        }
        return anio.toString()+quincena.toString();
    }

    public int intValue(){
        return new Integer(this.toString()).intValue();
    }
}